home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xconq / unit.h < prev    next >
C/C++ Source or Header  |  1995-05-09  |  6KB  |  164 lines

  1. /* Copyright (c) 1987, 1988  Stanley T. Shebs, University of Utah. */
  2. /* This program may be used, copied, modified, and redistributed freely */
  3. /* for noncommercial purposes, so long as this notice remains intact. */
  4.  
  5. #pragma comment(exestr, "@(#) unit.h 12.1 95/05/09 ")
  6.  
  7. /* RCS $Header: unit.h,v 1.1 88/06/21 12:29:48 shebs Exp $ */
  8.  
  9. /* Definitions about units and their orders. */
  10.  
  11. #define NOTHING (MAXUTYPES+1)  /* A number guaranteed to be a non-unit. */
  12.  
  13. /* Unit order types.  Each type has a letter, name, short name, and some */
  14. /* parameter types that guide how the order will be input. */
  15.  
  16. #define NUMORDERTYPES 8
  17.  
  18. #define NONE     0
  19. #define AWAKE    1
  20. #define SENTRY   2
  21. #define MOVEDIR  3
  22. #define MOVETO   4
  23. #define EDGE     5
  24. #define FOLLOW   6
  25. #define PATROL   7
  26.  
  27. #define ORDERNAMES \
  28.   { "None", "Awake", "Sentry", "Dir Move", "Move to", \
  29.     "Follow Edge", "Follow Leader", "Patrol" }
  30.  
  31. /* Types of arguments that orders can have. */
  32.  
  33. #define NOARG     0
  34. #define DIR       1
  35. #define POS       2
  36. #define LEADER    3
  37. #define WAYPOINTS 4
  38.  
  39. #define ORDERARGS \
  40.   { NOARG, NOARG, NOARG, DIR, POS, DIR, LEADER, WAYPOINTS }
  41.  
  42. #define ORDERARGNAMES \
  43.   { "no args", "no args", "no args", "direction", \
  44.     "destination", "direction", "unit", "waypoints" }
  45.  
  46. /* Number of points possible in order parameters.  If actual number not */
  47. /* implicit in order type, then will need a count field somewhere. */
  48.  
  49. #define NUMWPS 2
  50.  
  51. /* Bit-encoded flags that specify's units behavior when under orders. */
  52.  
  53. #define ENEMYWAKE     0x01
  54. #define NEUTRALWAKE   0x02
  55. #define SUPPLYWAKE    0x04
  56. #define ATTACKUNIT    0x08
  57. #define SHORTESTPATH  0x10
  58.  
  59. #define ALLFLAGS      0x1f
  60.  
  61. #define NORMAL  ALLFLAGS
  62.  
  63. /* tiny hack structure */
  64.  
  65. typedef struct a_pt {
  66.     short x, y;
  67. } Pt;
  68.  
  69. /* Definition of an "order", which is the means by which a unit keeps */
  70. /* track of what it should do.  Needs the encapsulation because orders */
  71. /* show up in both units and in collections of standing orders. */
  72.  
  73. typedef struct a_order {
  74.     short type;               /* type of order (awake, random, etc) */
  75.     short rept;               /* number to repeat order */
  76.     short flags;              /* bit vector of special flags */
  77.     union {
  78.     short dir;            /* a direction */
  79.     struct a_unit *leader;  /* pointer to a leader unit */
  80.     Pt pt[NUMWPS];        /* small array of coordinates */
  81.     } p;                      /* parameters of an order */
  82. } Order;
  83.  
  84. /* A standing order is actually an array with an order for each unit type. */
  85. /* The structure is allocated only when a standing order is given. */
  86.  
  87. typedef struct s_order {
  88.     Order *orders[MAXUTYPES];
  89. } StandingOrder;
  90.  
  91. /* This structure should be small, because there may be many of them. */
  92. /* On the other hand, changing shorts to chars would entail fiddling with */
  93. /* mapfile code, so beware. */
  94.  
  95. typedef struct a_unit {
  96.     /* Level 1 detail */
  97.     short type;                /* type (army, ship, etc) */
  98.     char *name;                /* the name, if given */
  99.     short x, y;                /* position of unit on map */
  100.     struct a_side *side;       /* whose side this unit is on */
  101.     /* Level 2 detail */
  102.     short id;                  /* truly unique id number */
  103.     short number;              /* semi-unique id number */
  104.     struct a_side *trueside;   /* whose side this unit is really on */
  105.     short hp;                  /* how much more damage it can take */
  106.     short quality;             /* "veteran-ness" */
  107.     short morale;              /* how happy our guys are */
  108.     short fatigue;             /* how tired they are */
  109.     short product;             /* type of unit this unit is producing */
  110.     short schedule;            /* when the unit will be done */
  111.     short built;               /* how many units of current type made so far */
  112.     struct a_unit *transport;  /* pointer to transporter if any */
  113.     short supply[MAXRTYPES];   /* how much supply we're carrying */
  114.     /* Level 3 detail */
  115.     short group;               /* group to which unit belongs (machine) */
  116.     short goal;                /* personal goal of unit */
  117.     short gx, gy;              /* current goal position */
  118.     short movesleft;           /* how many moves left in this turn */
  119.     short actualmoves;         /* hexes actually covered this turn */
  120.     short lastdir;             /* last direction of move */
  121.     short awake;               /* true if unit temporarily awake */
  122.     Order orders;              /* current orders being carried out */
  123.     StandingOrder *standing;   /* pointer to collection of standing orders */
  124.     /* Never saved */
  125.     struct a_unit *occupant;   /* pointer to first unit being carried */
  126.     struct a_unit *nexthere;   /* pointer to fellow occupant */
  127.     struct a_unit *next;       /* next unit in list of all units */
  128. } Unit;
  129.  
  130. /* Some convenient macros. */
  131.  
  132. #define for_all_units(v) for (v = unitlist; v != NULL; v = v->next)
  133.  
  134. #define for_all_occupants(u1,u2) \
  135.   for (u2 = u1->occupant; u2 != NULL; u2 = u2->nexthere)
  136.  
  137. #define alive(u) ((u)->hp > 0)
  138.  
  139. #define cripple(u) ((u)->hp < utypes[(u)->type].crippled)
  140.  
  141. #define neutral(u) ((u)->side == NULL)
  142.  
  143. #define producing(u) ((u)->product != NOTHING)
  144.  
  145. #define busy(u) (producing(u) || (u)->schedule > 0)
  146.  
  147. #define idled(u) (utypes[(u)->type].maker && !busy(u))
  148.  
  149. #define mobile(u) (utypes[u].speed > 0)
  150.  
  151. #define could_occupy(u,t) (could_move(u,t))
  152.  
  153. /* Unit variables. */
  154.  
  155. extern Unit *unitlist, *tmpunit;
  156. extern Unit *create_unit(), *read_basic_unit(), *random_start_unit();
  157. extern Unit *find_unit();
  158.  
  159. extern int numunits, orderargs[];
  160.  
  161. extern char *ordernames[];
  162. extern char *random_unit_name(), *unit_handle(), *short_unit_handle();
  163. extern char *make_unit_name(), *order_desig();
  164.